﻿(function($){
	var _obj={};//内部对象，仅仅作为内部参数的载体，不对外公开
	//后期添加一个方法，是否单例single
	_init();
	$(function(){_ready()});
	//============================================================内部方法
	function _show(p){
		if(_obj._p){return;}
		p=p?p:{};
		_flush(p,"show");//刷新
		$(p.win||window).bind("resize",_wait_resize_fun=function(){_flush(p,"resize")});
		$(p.win||window).bind("scroll",_wait_scroll_fun=function(){_flush(p,'scroll')});
		_obj._p=p;
	}
	function _hide(){
		if(!_obj._p){return;}
		_flush(_obj._p,"hide");//刷新
		$(_obj._p.win||window).unbind("resize",_wait_resize_fun);
		$(_obj._p.win||window).unbind("scroll",_wait_scroll_fun);
		if(_obj._p.style=='style3'){
			$("#wait_obj_info_style3_progressBarDiv").width('0%');
			$("#wait_obj_info_style3_progressBarTextDiv").html('0%');
		}
		_obj._p=null;
	}
	function _updateProgressBar(i){
		if(!_obj._p || _obj._p.style!='style3'){return;}
		if(isNaN(i)){return;}
		i==i<0?0:i;
		i==i>100?100:i;
		_obj._p._updateProgressBarCount=i;
		_flush(_obj._p,'updateProgressBar');
		if(i==100){//完成调用方法
			
		}
	}
	


	//初始化调用
	function _init(){
		window["FDCWait"]={};//window注册
		_obj._cssFile="../css/wait.css";//此js需要的外部css文件，一定要是相对地址
		_obj._cssPath=_generatePath(_obj._cssFile);//css文件全地址
		_addCSS(window,_obj._cssPath);
		_obj._bg=document.createElement("DIV");//背景div
		//显示的信息所有div,有多种风格
		_obj._info_style1=document.createElement("DIV");
		_obj._info_style2=document.createElement("DIV");
		_obj._info_style3=document.createElement("DIV");
		//加载基本的css类
		$(_obj._bg).addClass("wait_obj_bg_base");
		$(_obj._info_style1).addClass("wait_obj_info_style1");
		$(_obj._info_style2).addClass("wait_obj_info_style2");
		$(_obj._info_style2).append("<div id='wait_obj_info_style2_imgDiv'></div>"+
		"<label id='wait_obj_info_style2_infoLabel'>加载中，请稍候</label>");
		$(_obj._info_style3).addClass("wait_obj_info_style3");
		$(_obj._info_style3).append("<div id='wait_obj_info_style3_progressBarContainerDiv'>"+
		"<div id='wait_obj_info_style3_progressBarDiv'></div>"+
		"<div id='wait_obj_info_style3_progressBarTextDiv'>30%</div>"
		+"</div>");
	}
	//当页面载入完成之后调用
	function _ready(){}
	var cc=0;
	//刷新屏幕,重新计算某些参数,计算的时候为了避免之前的影响，所以先隐藏元素,或缩小
	function _flush(p,action){
		var win=p.win||window;
		var bg=_obj._bg;
		var info=eval('_obj._info_'+(p.style?p.style:'style1'));
		switch(action){
			case 'hide':
				$(bg).remove();
				$(info).remove();
				break;
			case 'show':
				$("body",win.document).prepend(bg,info);
				$(bg).show();
				$(info).show();
			case 'resize':
				var p=_generateP(win);
				$(bg).css({
					width:p.w+'px',
					height:p.h+'px'
				});
				$(info).css({
					top:($(win).height()-$(info).height())/2+$(win.document).scrollTop()+'px',
					left:($(win).width()-$(info).width())/2+$(win.document).scrollLeft()+'px'
				});
				break;
			case 'scroll':
				_flush._scrollCount=!_flush._scrollCount?1:_flush._scrollCount+1;
				if(_flush._scrollCount==1){
					cc++;//统计次数
					//;$("#wait_obj_info_style2_infoLabel").text(cc)
					;_scrollListen(win,info);}
				break;
			case 'updateProgressBar':
				$("#wait_obj_info_style3_progressBarDiv").width(p._updateProgressBarCount+'%');
				$("#wait_obj_info_style3_progressBarTextDiv").html(p._updateProgressBarCount+'%');
				break;
		}
	}
	
	function _scrollListen(win,info){//滚动监听器
		var c=_flush._scrollCount;
		setTimeout(function(){
			if(c!=_flush._scrollCount){
				_scrollListen(win,info);
			}else{
				$(info).stop();
				$(info).animate({
					top:($(win).height()-$(info).height())/2+$(win.document).scrollTop()+'px',
					left:($(win).width()-$(info).width())/2+$(win.document).scrollLeft()+'px',
				},500);
				_flush._scrollCount=0;
			}
		},200);
	}
	
	function _generateP(win){
		
		return {
			//w:win.document.body.scrollWidth|| win.document.documentElement.scrollWidth||0,
			//h:Math.max(win.document.body.scrollHeight||0,win.document.documentElement.scrollHeight||0)
			//w:$("body",win.document).outerWidth(true),
			//h:$('body',win.document).outerHeight(true)
			
			//w:Math.max(win.document.body.scrollWidth|| win.document.documentElement.scrollWidth,$(win).width()),
			//w:(win.document.body.scrollWidth|| win.document.documentElement.scrollWidth||0),
			//w:Math.max($(window).width(),$('body',win.document).outerWidth(true)),
			//w:document.body.scrollWidth==Math.max(document.body.scrollWidth,$(win).width())?
				//$(win.document).width():$(win).width(),
			w:Math.max($('body',win.document).outerWidth(true),$(win).width()),
			h:$('body',win.document).outerHeight(true)==Math.max($(win).height(),$('body',win.document).outerHeight(true))?
				$(win.document).height():$(win).height()-$('body',win.document).outerHeight(true)>parseInt($('body',win.document).css('margin-bottom').replace('px',''))?$(win).height():$(win.document).height()
		}
	}
	/**
	 * 向window添加css的方法
	 */
	function _addCSS(win,cssPath){
		var link=win.document.createElement("link");
		link.setAttribute("rel", "stylesheet");
		link.setAttribute("type", "text/css");
		link.setAttribute("href", cssPath);
		$("head",win.document).append(link);
	}
	
	/**
	 * 根据相对地址的参数产生全地址的方法(参数格式必须为相对地址)
	 */
	function _generatePath(p){
		if(!p){return null;}
		var temp=p.replace(/\.{2}\//g,"");//以../来判断返回了多少级的上层目录
		var back=(p.length-temp.length)/3;
		var reg="";
		for(var i=0;i<back;i++){
			reg+="\\/[^\\/]*";
		}
		reg+="\\/[^\\/]*\\.js$";
		reg=new RegExp(reg,'i');
		//此js文件的地址
		var jsPath=$("script:last")[0].src||"";
		var cssPath=jsPath.replace(reg,"")+"/"+temp.replace(/\.\//,'');
		return cssPath;
	}
//**********************************************************API**********************************************
	/**
	 * 显示
	 * p {win 锁住哪个win，默认为window, style 风格 默认"style1" , tip 提示消息 默认无}
	 */
	window.FDCWait.show=function(p){_show(p)}
	window.FDCWait.hide=function(){_hide()}
	window.FDCWait.updateProgressBar=function(i){_updateProgressBar(i)}
	window.FDCWait.getInstance=function(single){}
})(jQuery)